import { addCache, clearCache, getCache } from "./cache";
import config from "./config";
import generateUniqueId from "./utils";
export const originalProto = XMLHttpRequest.prototype;
export const originalOpen = XMLHttpRequest.originalProto.open;
export const originalSend = XMLHttpRequest.originalProto.send;

/**
 * 判断当前浏览器是否支持 sendBeacon 方法
 *
 * @returns {boolean} 如果当前浏览器支持 sendBeacon 方法，则返回 true；否则返回 false
 */
export function isSupportSendBeacon() {
  return "sendBeacon" in navigator;
}

export function report(data) {
  if (!config.url) {
    console.error("请设置上传的url地址");
    return;
  }
  const reportData = JSON.stringify({
    id: generateUniqueId(),
    data,
  });
  // 使用图片方式
  if (config.isImageUpload) {
    imgRequest(reportData);
  }else{
    // 优先使用 sendBeacon
    if (window.navigator.sendBeacon) {
      return beaconRequest(reportData);
    }
    // 普通的ajax发送请求数据
    return xhrRequest(reportData);
  }
}

// 批量上报数据
export function lazyReportBatch(data) {
  addCache(data);
  const dataCache = getCache();
  console.error("dataCache", dataCache);

  if (dataCache.length && dataCache.length > config.batchSize) {
    report(dataCache);
    clearCache();
  }
}

// 上报图片
export function imgRequest(data) {
  const img = new Image();
  img.src = `${config.url}?data=${encodeURIComponent(JSON.stringify(data))}`;
}

// 普通的ajax发送请求数据
export function xhrRequest(data) {
  // 如果浏览器支持 requestIdleCallback
  if (window.requestIdleCallback) {
    // 使用 requestIdleCallback 发送数据
    window.requestIdleCallback(
      () => {
        const xhr = new XMLHttpRequest();
        originalOpen.call(xhr, "POST", config.url);
        originalSend.call(xhr, JSON.stringify(data));
      },
      {
        // 设置超时时间为 3000 毫秒
        timeout: 3000,
      }
    );
  } else {
    // 如果浏览器不支持 requestIdleCallback，则使用 setTimeout
    setTimeout(() => {
      // 调用 sendBeacon 函数发送数据
      const xhr = new XMLHttpRequest();
      originalOpen.call(xhr, "POST", config.url);
      originalSend.call(xhr, JSON.stringify(data));
    });
  }
}

const sendBeacon = navigator.sendBeacon;

export function beaconRequest(data) {
  // 如果浏览器支持 requestIdleCallback
  if (window.requestIdleCallback) {
    // 使用 requestIdleCallback 发送数据
    window.requestIdleCallback(
      () => {
        // 调用 sendBeacon 函数发送数据
        sendBeacon(config.url, data);
      },
      {
        // 设置超时时间为 3000 毫秒
        timeout: 3000,
      }
    );
  } else {
    // 如果浏览器不支持 requestIdleCallback，则使用 setTimeout
    setTimeout(() => {
      // 调用 sendBeacon 函数发送数据
      sendBeacon(config.url, data);
    });
  }
}
